Binder通信原理与弊端解析

您所在的位置:网站首页 android socket通信框架 Binder通信原理与弊端解析

Binder通信原理与弊端解析

#Binder通信原理与弊端解析| 来源: 网络整理| 查看: 265

Binder 定义

简单来说,Binder 就是用来Client 端和 Server 端通信的。并且 Client 端和 Server 端 可以在一个进程也可以不在同一个进程,Client 可以向 Server 端发起远程调用,也可以向Server传输数据(当作函数参数来传),并且不用关心对方在哪个进程。

Binder的基本原理

Binder借助了内存映射(mmap)的方法,在内核空间和接收方用户空间的数据缓存区之间做了一层内存映射。从发送方用户空间拷贝到内核空间缓存区的数据,就相当于直接拷贝到了接收方用户空间的数据缓存区,从而减少了一次数据拷贝。

设计夸进程通信所关注的点有哪些

如果使用 Linux 提供的夸进程通信方式来看,流程如上图,Client 端通过函数传参序列化成 buffer,然后通过 Linux提供的如 Socket ,管道,等通信方式进行传输,然后到 Server端进行解析。

像早期的电话总机接线员,我们想打个电话,先打到总机告诉接线员我要打到哪里,接线员再把电话转接过去,这样的方式即麻烦,采用人工的方式,效率慢,还需要先接收再转接,还不安全。理想的跨进城通信方式要保证 性能好、使用方便、安全 等需求,binder 和其他方式对比就满足了这些要求。

Binder 的意义Binder 并不是 Linux 提供的跨进程机制,它是跑在驱动层的跨进程方式,它是数据内核太,并没有使用 Linux 的跨进程通信方式(socket,pipe,共享内存…)性能:Linux 提供的socket、pipe 是需要内核来做中转,相当于两次数据拷贝,一次是从应用层拷贝到内核,一次是从内核拷贝到应用层。Binder 是有开辟一块物理内存,同时影射到内存和用户空间,所以当你把数据拷贝到内核空间时也就相当于拷贝到了应用空间了。方便易用:逻辑简单直接,不容易出问题,共享内存虽然性能很好,但是用起来比较复杂,没有 binder 好用。安全:普通的 Linux 的跨进程通信方式并不是很安全,比如 socket 它的 ip 地址都是开放的,只要知道 ip 就可以去连接访问了。主要我们拿不到调用方可靠的信息,可靠的信息只能在IPC内核态的时候添加好,不能让调用方自己添加。binder 的通信架构

上图是展示的系统服务的 binder 通信,因为只有系统服务才能注册到 ServiceManager 中,应用的服务是无法注册到 ServiceManager 中的,通过不了权限验证。Client 是应用进程,Server 是系统服务(可能跑在 SystemServer 进程,也可能是单独进程)ServiceManager是一个单独的进程。无论是 Client 还是 Server 还是 ServiceManager,第一步都是需要先启动 binder 机制。

binder 通信

从ServiceManager开始,通过一系列的启动和准备,最后会进入 loop 循环等待Client 和 server 端的消息。具体逻辑可以查看ServiceManager 的作用、启动流程和工作原理。

上图 Server 端一般是系统服务,Client 一般是应用服务,所以一般显示 Server 先和 ServiceManager 交互,系统服务是如何注册到 ServiceManager 中的可以查看 怎样添加一个Android的系统服务?。

binder 驱动的分层架构图binder 通信弊端传统Linux IPC机制的缺点性能角度

管道、消息队列、Socket实现一次进程通信都需要2次内存拷贝,效率太低;

共享内存虽然不需要拷贝内存,但管理复杂;

Binder只需要一次内存拷贝,从性能角度来看,低于共享内存方式,优于其它方式。

IPC数据拷贝次数share mm0Binder1pipe MQ SOCKET2安全性考虑

a. 传统的IPC机制没有安全措施,接收方无法获得对方可靠的进程ID或用户ID,比如Socket通信的IP地址是客户端填入的,很可能被恶意程序篡改。

b. Android作为面向终端用户的开源平台,因此安全性极为重要。Android系统为每个已安装的App都分配了用户ID(UID),UID是鉴别进程身份的重要标识,通过UID可以进行一系列的权限校验

c. 传统IPC的接入点是开放的,任何程序都可以根据协议进行访问,无法阻止恶意程序的访问。

以上就是Android架构师所需要掌握的进程通信框架;更多Android架构讲解可以参考《Android核心技术手册》里面包含架构师进阶30多个模块,上千个技术点可让你进阶。需要可点击了解详情。

综上所述:

Android需要一种基于C/S架构的IPC机制,Server端需要能够对Client的请求进行身份校验,来保证数据的安全性。

Binder驱动是一种虚拟的字符设备,注册在/dev/binder中,其定义了一套Binder通信协议,负责建立进程间的Binder通信,提供了数据包在进程之间传递的一系列底层支持。应用进程访问Binder驱动也是通过系统调用实现。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3